/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.bs.beans.fiscal;

import com.bs.beans.Pessoa;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import org.jdesktop.observablecollections.ObservableCollections;

/**
 *
 * @author Bone
 */
@Entity
@Table(name = "NOTA_FISCAL")
public class NotaFiscal implements Serializable {
    @Transient
    private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "ID")
    private Integer id;
    @Column(name = "DATA_EMISSAO")
    @Temporal(TemporalType.DATE)
    private Date dataEmissao;
    @Column(name = "DATA_ENTRADA_SAIDA")
    @Temporal(TemporalType.DATE)
    private Date dataEntradaSaida;
    @Column(name = "ENTRADA")
    private Short entrada;
    @Column(name = "NUMERO")
    private Integer numero;
    @Column(name = "SERIE")
    private SerieDocumentoFiscal serie;
    @Column(name = "CHAVE_ACESSO")
    private String chaveAcesso;
    @Column(name = "NATUREZA_OPERACAO")
    private String naturezaOperacao;
    @Column(name = "PROTOCOLO")
    private String protocolo;
    @Column(name = "INSCRICAO_DO_SUBST_TRIBUTARIO")
    private String inscricaoDoSubstTributario;
    @JoinColumn(name = "EMITENTE",referencedColumnName = "ID")
    @ManyToOne
    private Pessoa emitente;
    @JoinColumn(name = "TRANSPORTADORA")
    @ManyToOne
    private Pessoa transportadora;
    @JoinColumn(name = "DESTINATARIO")
    @ManyToOne
    private Pessoa destinatario;
    // @Max(value=?)  @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
    @Column(name = "DESCONTO")
    private BigDecimal desconto;
    @Column(name = "FRETE")
    private BigDecimal frete;
    @Column(name = "SEGURO")
    private BigDecimal seguro;
    @Column(name = "OUTRAS_DESPESAS_ACESSORIAS")
    private BigDecimal outrasDespesasAcessorias;
    @Column(name = "INSCRICAO_MUNICIPAL")
    private Integer inscricaoMunicipal;
    @Column(name = "VALOR_SERVICO")
    private BigDecimal valorServico;
    @Column(name = "BASE_ISSQN")
    private BigDecimal baseIssqn;
    @Column(name = "VALOR_ISSQN")
    private BigDecimal valorIssqn;
    @Column(name = "DADOS_ADICIONAIS")
    private String dadosAdicionais;
    @Column(name = "RESERVADO_FISCO")
    private String reservadoFisco;
    @Column(name = "INDICADOR_PAGAMENTO")
    private Short indicadorPagamento;
    @Column(name = "MODELO")
    private ModeloDocumentoFiscal modelo;
    @Column(name = "TIPO_IMPRESSAO")
    private Short tipoImpressao;
    @Column(name = "TIPO_EMISSAO")
    private Short tipoEmissao;
    @Column(name = "DIGITO_CHAVE_ACESSO")
    private Short digitoChaveAcesso;
    @Column(name = "TP_AMBIENTE")
    private Short tpAmbiente;
    @Column(name = "FINALIDADE_NFE")
    private Short finalidadeNfe;
    @Column(name = "PROCESSO_EMISSAO")
    private Short processoEmissao;
    @Column(name = "VERSAO_PROCESSO_EMISSAO")
    private Integer versaoProcessoEmissao;
    @Column(name = "DATA_HORA_CONTINGENCIA")
    @Temporal(TemporalType.TIMESTAMP)
    private Date dataHoraContingencia;
    @Column(name = "JUSTIFICATIVA_CONTINGENCIA")
    private String justificativaContingencia;
    @JoinColumn(name = "NAT_INTERNA",referencedColumnName = "ID")
    @ManyToOne
    private NaturezaInterna natInterna;
    @OneToMany(mappedBy = "notaFiscal")
    private List<ProdutoNf> produtoNfList = new LinkedList<ProdutoNf>();
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "nota")
    private Collection<Duplicatas> duplicatasCollection;
    @OneToOne(fetch = FetchType.LAZY,cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE})
    @PrimaryKeyJoinColumn
    private LocalEntregaNota localEntregaNota;
    @OneToOne(fetch = FetchType.LAZY,cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE})
    @PrimaryKeyJoinColumn
    private LocalRetiradaNota localRetiradaNota;
    @OneToOne(fetch = FetchType.LAZY,cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE})
    @PrimaryKeyJoinColumn
    private VeiculoTransporte veiculoTransporte;
    @OneToOne(fetch = FetchType.LAZY,cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE})
    @PrimaryKeyJoinColumn
    private FiscoEmitente fiscoEmitente;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "notaFiscal")
    private Collection<NfReferenciada> nfReferenciadaCollection = ObservableCollections.observableList(new ArrayList<NfReferenciada>());
    

    public NotaFiscal() {
    }

    public NotaFiscal(Integer id) {
        this.id = id;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        Integer oldId = this.id;
        this.id = id;
        changeSupport.firePropertyChange("id", oldId, id);
    }

    public Date getDataEmissao() {
        return dataEmissao;
    }

    public void setDataEmissao(Date dataEmissao) {
        Date oldDataEmissao = this.dataEmissao;
        this.dataEmissao = dataEmissao;
        changeSupport.firePropertyChange("dataEmissao", oldDataEmissao, dataEmissao);
    }

    public Date getDataEntradaSaida() {
        return dataEntradaSaida;
    }

    public void setDataEntradaSaida(Date dataEntradaSaida) {
        Date oldDataEntradaSaida = this.dataEntradaSaida;
        this.dataEntradaSaida = dataEntradaSaida;
        changeSupport.firePropertyChange("dataEntradaSaida", oldDataEntradaSaida, dataEntradaSaida);
    }

    public Short getEntrada() {
        return entrada;
    }

    public void setEntrada(Short entrada) {
        Short oldEntrada = this.entrada;
        this.entrada = entrada;
        changeSupport.firePropertyChange("entrada", oldEntrada, entrada);
    }

    public Integer getNumero() {
        return numero;
    }

    public void setNumero(Integer numero) {
        Integer oldNumero = this.numero;
        this.numero = numero;
        changeSupport.firePropertyChange("numero", oldNumero, numero);
    }

    public String getSerie() {
        return serie;
    }

    public void setSerie(String serie) {
        String oldSerie = this.serie;
        this.serie = serie;
        changeSupport.firePropertyChange("serie", oldSerie, serie);
    }

    public String getChaveAcesso() {
        return chaveAcesso;
    }

    public void setChaveAcesso(String chaveAcesso) {
        String oldChaveAcesso = this.chaveAcesso;
        this.chaveAcesso = chaveAcesso;
        changeSupport.firePropertyChange("chaveAcesso", oldChaveAcesso, chaveAcesso);
    }

    public String getNaturezaOperacao() {
        return naturezaOperacao;
    }

    public void setNaturezaOperacao(String naturezaOperacao) {
        String oldNaturezaOperacao = this.naturezaOperacao;
        this.naturezaOperacao = naturezaOperacao;
        changeSupport.firePropertyChange("naturezaOperacao", oldNaturezaOperacao, naturezaOperacao);
    }

    public String getProtocolo() {
        return protocolo;
    }

    public void setProtocolo(String protocolo) {
        String oldProtocolo = this.protocolo;
        this.protocolo = protocolo;
        changeSupport.firePropertyChange("protocolo", oldProtocolo, protocolo);
    }

    public String getInscricaoDoSubstTributario() {
        return inscricaoDoSubstTributario;
    }

    public void setInscricaoDoSubstTributario(String inscricaoDoSubstTributario) {
        String oldInscricaoDoSubstTributario = this.inscricaoDoSubstTributario;
        this.inscricaoDoSubstTributario = inscricaoDoSubstTributario;
        changeSupport.firePropertyChange("inscricaoDoSubstTributario", oldInscricaoDoSubstTributario, inscricaoDoSubstTributario);
    }

    public Pessoa getEmitente() {
        return emitente;
    }

    public void setEmitente(Pessoa emitente) {
        Pessoa oldEmitente = this.emitente;
        this.emitente = emitente;
        changeSupport.firePropertyChange("emitente", oldEmitente, emitente);
    }

    public Pessoa getTransportadora() {
        return transportadora;
    }

    public void setTransportadora(Pessoa transportadora) {
        Pessoa oldTransportadora = this.transportadora;
        this.transportadora = transportadora;
        changeSupport.firePropertyChange("transportadora", oldTransportadora, transportadora);
    }

    public Pessoa getDestinatario() {
        return destinatario;
    }

    public void setDestinatario(Pessoa destinatario) {
        Pessoa oldDestinatario = this.destinatario;
        this.destinatario = destinatario;
        changeSupport.firePropertyChange("destinatario", oldDestinatario, destinatario);
    }

    public BigDecimal getDesconto() {
        return desconto;
    }

    public void setDesconto(BigDecimal desconto) {
        BigDecimal oldDesconto = this.desconto;
        this.desconto = desconto;
        changeSupport.firePropertyChange("desconto", oldDesconto, desconto);
    }

    public BigDecimal getFrete() {
        return frete;
    }

    public void setFrete(BigDecimal frete) {
        BigDecimal oldFrete = this.frete;
        this.frete = frete;
        changeSupport.firePropertyChange("frete", oldFrete, frete);
    }

    public BigDecimal getSeguro() {
        return seguro;
    }

    public void setSeguro(BigDecimal seguro) {
        BigDecimal oldSeguro = this.seguro;
        this.seguro = seguro;
        changeSupport.firePropertyChange("seguro", oldSeguro, seguro);
    }

    public BigDecimal getOutrasDespesasAcessorias() {
        return outrasDespesasAcessorias;
    }

    public void setOutrasDespesasAcessorias(BigDecimal outrasDespesasAcessorias) {
        BigDecimal oldOutrasDespesasAcessorias = this.outrasDespesasAcessorias;
        this.outrasDespesasAcessorias = outrasDespesasAcessorias;
        changeSupport.firePropertyChange("outrasDespesasAcessorias", oldOutrasDespesasAcessorias, outrasDespesasAcessorias);
    }

    public Integer getInscricaoMunicipal() {
        return inscricaoMunicipal;
    }

    public void setInscricaoMunicipal(Integer inscricaoMunicipal) {
        Integer oldInscricaoMunicipal = this.inscricaoMunicipal;
        this.inscricaoMunicipal = inscricaoMunicipal;
        changeSupport.firePropertyChange("inscricaoMunicipal", oldInscricaoMunicipal, inscricaoMunicipal);
    }

    public BigDecimal getValorServico() {
        return valorServico;
    }

    public void setValorServico(BigDecimal valorServico) {
        BigDecimal oldValorServico = this.valorServico;
        this.valorServico = valorServico;
        changeSupport.firePropertyChange("valorServico", oldValorServico, valorServico);
    }

    public BigDecimal getBaseIssqn() {
        return baseIssqn;
    }

    public void setBaseIssqn(BigDecimal baseIssqn) {
        BigDecimal oldBaseIssqn = this.baseIssqn;
        this.baseIssqn = baseIssqn;
        changeSupport.firePropertyChange("baseIssqn", oldBaseIssqn, baseIssqn);
    }

    public BigDecimal getValorIssqn() {
        return valorIssqn;
    }

    public void setValorIssqn(BigDecimal valorIssqn) {
        BigDecimal oldValorIssqn = this.valorIssqn;
        this.valorIssqn = valorIssqn;
        changeSupport.firePropertyChange("valorIssqn", oldValorIssqn, valorIssqn);
    }

    public String getDadosAdicionais() {
        return dadosAdicionais;
    }

    public void setDadosAdicionais(String dadosAdicionais) {
        String oldDadosAdicionais = this.dadosAdicionais;
        this.dadosAdicionais = dadosAdicionais;
        changeSupport.firePropertyChange("dadosAdicionais", oldDadosAdicionais, dadosAdicionais);
    }

    public String getReservadoFisco() {
        return reservadoFisco;
    }

    public void setReservadoFisco(String reservadoFisco) {
        String oldReservadoFisco = this.reservadoFisco;
        this.reservadoFisco = reservadoFisco;
        changeSupport.firePropertyChange("reservadoFisco", oldReservadoFisco, reservadoFisco);
    }

    public Short getIndicadorPagamento() {
        return indicadorPagamento;
    }

    public void setIndicadorPagamento(Short indicadorPagamento) {
        Short oldIndicadorPagamento = this.indicadorPagamento;
        this.indicadorPagamento = indicadorPagamento;
        changeSupport.firePropertyChange("indicadorPagamento", oldIndicadorPagamento, indicadorPagamento);
    }

    public String getModelo() {
        return modelo;
    }

    public void setModelo(String modelo) {
        String oldModelo = this.modelo;
        this.modelo = modelo;
        changeSupport.firePropertyChange("modelo", oldModelo, modelo);
    }

    public Short getTipoImpressao() {
        return tipoImpressao;
    }

    public void setTipoImpressao(Short tipoImpressao) {
        Short oldTipoImpressao = this.tipoImpressao;
        this.tipoImpressao = tipoImpressao;
        changeSupport.firePropertyChange("tipoImpressao", oldTipoImpressao, tipoImpressao);
    }

    public Short getTipoEmissao() {
        return tipoEmissao;
    }

    public void setTipoEmissao(Short tipoEmissao) {
        Short oldTipoEmissao = this.tipoEmissao;
        this.tipoEmissao = tipoEmissao;
        changeSupport.firePropertyChange("tipoEmissao", oldTipoEmissao, tipoEmissao);
    }

    public Short getDigitoChaveAcesso() {
        return digitoChaveAcesso;
    }

    public void setDigitoChaveAcesso(Short digitoChaveAcesso) {
        Short oldDigitoChaveAcesso = this.digitoChaveAcesso;
        this.digitoChaveAcesso = digitoChaveAcesso;
        changeSupport.firePropertyChange("digitoChaveAcesso", oldDigitoChaveAcesso, digitoChaveAcesso);
    }

    public Short getTpAmbiente() {
        return tpAmbiente;
    }

    public void setTpAmbiente(Short tpAmbiente) {
        Short oldTpAmbiente = this.tpAmbiente;
        this.tpAmbiente = tpAmbiente;
        changeSupport.firePropertyChange("tpAmbiente", oldTpAmbiente, tpAmbiente);
    }

    public Short getFinalidadeNfe() {
        return finalidadeNfe;
    }

    public void setFinalidadeNfe(Short finalidadeNfe) {
        Short oldFinalidadeNfe = this.finalidadeNfe;
        this.finalidadeNfe = finalidadeNfe;
        changeSupport.firePropertyChange("finalidadeNfe", oldFinalidadeNfe, finalidadeNfe);
    }

    public Short getProcessoEmissao() {
        return processoEmissao;
    }

    public void setProcessoEmissao(Short processoEmissao) {
        Short oldProcessoEmissao = this.processoEmissao;
        this.processoEmissao = processoEmissao;
        changeSupport.firePropertyChange("processoEmissao", oldProcessoEmissao, processoEmissao);
    }

    public Integer getVersaoProcessoEmissao() {
        return versaoProcessoEmissao;
    }

    public void setVersaoProcessoEmissao(Integer versaoProcessoEmissao) {
        Integer oldVersaoProcessoEmissao = this.versaoProcessoEmissao;
        this.versaoProcessoEmissao = versaoProcessoEmissao;
        changeSupport.firePropertyChange("versaoProcessoEmissao", oldVersaoProcessoEmissao, versaoProcessoEmissao);
    }

    public Date getDataHoraContingencia() {
        return dataHoraContingencia;
    }

    public void setDataHoraContingencia(Date dataHoraContingencia) {
        Date oldDataHoraContingencia = this.dataHoraContingencia;
        this.dataHoraContingencia = dataHoraContingencia;
        changeSupport.firePropertyChange("dataHoraContingencia", oldDataHoraContingencia, dataHoraContingencia);
    }

    public String getJustificativaContingencia() {
        return justificativaContingencia;
    }

    public void setJustificativaContingencia(String justificativaContingencia) {
        String oldJustificativaContingencia = this.justificativaContingencia;
        this.justificativaContingencia = justificativaContingencia;
        changeSupport.firePropertyChange("justificativaContingencia", oldJustificativaContingencia, justificativaContingencia);
    }

    public NaturezaInterna getNatInterna() {
        return natInterna;
    }

    public void setNatInterna(NaturezaInterna natInterna) {
        NaturezaInterna oldNatInterna = this.natInterna;
        this.natInterna = natInterna;
        changeSupport.firePropertyChange("natInterna", oldNatInterna, natInterna);
    }

    public List<ProdutoNf> getProdutoNfList() {
        return produtoNfList;
    }

    public void setProdutoNfList(List<ProdutoNf> produtoNfList) {
        this.produtoNfList.clear();
        this.produtoNfList.addAll(produtoNfList);
    }

    public LocalEntregaNota getLocalEntregaNota() {
        return localEntregaNota;
    }

    public void setLocalEntregaNota(LocalEntregaNota localEntregaNota) {
        LocalEntregaNota old = this.localEntregaNota;
        this.localEntregaNota = localEntregaNota;
        changeSupport.firePropertyChange("localEntregaNota", old, localEntregaNota);
    }

    public LocalRetiradaNota getLocalRetiradaNota() {
        return localRetiradaNota;
    }

    public void setLocalRetiradaNota(LocalRetiradaNota localRetiradaNota) {
        LocalRetiradaNota old = this.localRetiradaNota;
        this.localRetiradaNota = localRetiradaNota;
        changeSupport.firePropertyChange("localRetiradaNota", old, localRetiradaNota);
    }

    public VeiculoTransporte getVeiculoTransporte() {
        return veiculoTransporte;
    }

    public void setVeiculoTransporte(VeiculoTransporte veiculoTransporte) {
        VeiculoTransporte old = this.veiculoTransporte;
        this.veiculoTransporte = veiculoTransporte;
        changeSupport.firePropertyChange("veiculoTransporte", old, veiculoTransporte);
    }

    public FiscoEmitente getFiscoEmitente() {
        return fiscoEmitente;
    }

    public void setFiscoEmitente(FiscoEmitente fiscoEmitente) {
        FiscoEmitente old = this.fiscoEmitente;
        this.fiscoEmitente = fiscoEmitente;
        changeSupport.firePropertyChange("fiscoEmitente", old, fiscoEmitente);
    }
    
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof NotaFiscal)) {
            return false;
        }
        NotaFiscal other = (NotaFiscal) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Apagar.NotaFiscal[ id=" + id + " ]";
    }

    public void addPropertyChangeListener(PropertyChangeListener listener) {
        changeSupport.addPropertyChangeListener(listener);
    }

    public void removePropertyChangeListener(PropertyChangeListener listener) {
        changeSupport.removePropertyChangeListener(listener);
    }

    public Collection<Duplicatas> getDuplicatasCollection() {
        return duplicatasCollection;
    }

    public void setDuplicatasCollection(Collection<Duplicatas> duplicatasCollection) {
        this.duplicatasCollection = duplicatasCollection;
    }

    public Collection<NfReferenciada> getNfReferenciadaCollection() {
        return nfReferenciadaCollection;
    }

    public void setNfReferenciadaCollection(Collection<NfReferenciada> nfReferenciadaCollection) {
        Collection<NfReferenciada> old = this.nfReferenciadaCollection;
        this.nfReferenciadaCollection.clear();
        this.nfReferenciadaCollection.addAll(nfReferenciadaCollection);
        changeSupport.firePropertyChange("nfReferenciadaCollection", old, nfReferenciadaCollection);
    }
    
}
